from goods.models import GoodsChannel
def get_categories():
    # 1,定义字典
    categories = {}

    # 2,获取频道(一级),并且是以"sequence"排序的内容
    # GoodsChannel表有37个,channels实际得到的是一个排列好的37个频道列表

    channels = GoodsChannel.objects.order_by('sequence')
    # 3,遍历频道
    for channel in channels:
        # 3,1 获取组编号
        group_id = channel.group_id

        # 3,2组装数据,这里只是做了一个数据格式，后面才是给里边添加内容
        if group_id not in categories:
            categories[group_id] = {'channels': [], 'sub_cats': []}  # 按照组编号进行添加2级，3级数据，目前只是空字典，后面才是加数据

        # 3.3 添加一级分类到字典中
        # 一级表也就是频道表tb_goods_channel里边是没有对应的名字的,所以我们需要通过.category外键关联到三级表tb_goods_category,查找对应的频道名字.才能给前端.url连接是1级独有的,所以在一级表查找(1.2.3级数据都在tb_goods_category里边有,通过自关联)
        category1 = channel.category
        category1_dict = {
            'id': category1.id,
            'name': category1.name,
            'url': channel.url
        }
        categories[group_id]['channels'].append(category1_dict)
        # 3,4获取二级分类,添加到字典中
        # subs是GoodsCategory类里边定义的related_name

        # related_name代替了类名的小写.set的作用,也就是获取自关联表格里边,父级id一样的所有内容.如05笔记里边的省市区的的获取
        # 下边获取到了所有同一个频道级的所有2级数据，
        sub_cats = category1.subs.all()
        # 将每个频道所属商品遍历，并添加到字典的2级 数据
        for cat2 in sub_cats:
            categories[group_id]['sub_cats'].append(cat2)
    # 4,返回分类信息
    return categories